/**
 * 代表一个Buff的接口，包含了Buff的所有基本信息。
 */
export interface interfaceBuff {
    Uid: number;            // Buff的唯一标识符
    Color: string;          // Buff的颜色，用于视觉效果
    Value: number;          // Buff的效果值，伤害或者增益值

    Elapsed: number;        // Buff自上次更新以来的经过时间
    TotalElapsed: number;  // Buff从创建以来的总经过时间
    Duration: number;      // Buff的总持续时间
    Interval: number;      // Buff效果的更新间隔时间
}

/**
 * 处理Buff的管理和更新的类。
 */
export class BuffHolder {
    private _buffs: interfaceBuff[] = []; // 当前所有的Buff列表
    private _callBack: Function;          // Buff更新时的回调函数
    private _target: any;                // 回调函数的上下文（通常是this）

    /**
     * 添加一个新的Buff，或者更新已存在的Buff。
     * @param uid - Buff的唯一标识符
     * @param color - Buff的颜色
     * @param value - Buff的效果值(伤害)
     * @param duration - Buff的总持续时间
     * @param interval - Buff效果的更新间隔时间
     */
    public Add(uid: number, color: string, value: number, duration: number, interval: number) {
        // 查找是否已经存在该UID的Buff
        let buff = this._buffs.find(item => item.Uid === uid);
        if (buff) {
            // 如果Buff已存在，更新其属性
            buff.Value = value;
            buff.Duration = duration;
            buff.Interval = interval;
            buff.Elapsed = 0;         // 重置经过时间
            buff.TotalElapsed = 0;   // 重置总经过时间
        } else {
            // 如果Buff不存在，创建并添加到列表中
            this._buffs.push({
                Uid: uid,
                Color: color,
                Value: value,
                Elapsed: 0,
                TotalElapsed: 0,
                Duration: duration,
                Interval: interval
            });
        }
    }

    /**
     * 移除指定UID的Buff。
     * @param uid - 要移除的Buff的唯一标识符
     */
    public remove(uid: number) {
        // 查找并移除指定UID的Buff
        let index = this._buffs.findIndex(item => item.Uid === uid);
        if (index > -1) {
            this._buffs.splice(index, 1);
        }
    }

    /**
     * 更新所有Buff的状态，通常在每一帧调用。
     * @param deltaTime - 从上一帧到当前帧的时间差
     */
    public updated(deltaTime: number) {
        for (let i = 0; i < this._buffs.length; i++) {
            let buff = this._buffs[i];
            buff.Elapsed += deltaTime;          // 更新经过时间
            buff.TotalElapsed += deltaTime;    // 更新总经过时间

            // 如果经过时间超过了Buff的间隔时间，则触发回调
            if (buff.Elapsed >= buff.Interval) {
                buff.Elapsed = 0; // 重置经过时间
                this._callBack && this._callBack.apply(this._target, [buff.Uid, buff.Value, buff.Color]);
            }

            // 如果总经过时间超过了Buff的持续时间，则移除Buff
            if (buff.TotalElapsed >= buff.Duration) {
                this.remove(buff.Uid);
                i--; // 由于移除操作会改变数组长度，因此需要调整索引
            }
        }
    }

    /**
     * 设置Buff更新时的回调函数和上下文。
     * @param callBack - Buff更新时的回调函数
     * @param target - 回调函数的上下文（通常是this）
     */
    public onCallBack(callBack: Function, target?: any) {
        this._callBack = callBack;
        this._target = target;
    }
}
